package com.hp.modules.sys.service;

import com.hp.common.base.CommonPage;
import com.hp.common.base.IdAndIdsParam;
import com.hp.modules.sys.dto.SysUserWithRoleIdPageParam;
import com.hp.modules.sys.entity.SysMenu;
import com.hp.modules.sys.entity.SysUser;
import com.hp.modules.sys.vo.RouterVo;
import com.hp.modules.sys.vo.SysAccessTreeVo;
import com.hp.modules.sys.vo.SysMenuTreeVo;

import java.util.List;

/**
 * 权限管理相关接口
 */
public interface SysRbacService {
    /**
     * 获取权限树
     *
     * @param userId
     * @param roleId
     * @return
     */
    SysAccessTreeVo listAccessTree(Long userId, Long roleId);

    /**
     * 获取菜单树
     *
     * @param userId
     * @param roleId
     * @return
     */
    SysMenuTreeVo listMenuByRoleId(Long userId, Long roleId);

    /**
     * 角色成员列表
     *
     * @param param
     * @return
     */
    CommonPage<SysUser> listUserByRoleId(SysUserWithRoleIdPageParam param);

    /**
     * 保存用户角色关系
     *
     * @param param
     * @return
     */
    int saveUserRole(IdAndIdsParam param);

    /**
     * 从角色中移除用户
     *
     * @param param
     * @return
     */
    int deleteUserRole(IdAndIdsParam param);

    /**
     * 查询未加入指定角色的用户列表
     *
     * @param param
     * @return
     */
    CommonPage<SysUser> listUserNoInRole(SysUserWithRoleIdPageParam param);

    /**
     * 保存角色权限资源关系
     *
     * @param param
     * @return
     */
    int saveRoleAccess(IdAndIdsParam param);

    /**
     * 删除角色权限资源关系
     *
     * @param param
     * @return
     */
    int deleteRoleAccess(IdAndIdsParam param);

    /**
     * 保存角色菜单关系
     *
     * @param param
     */
    int saveRoleMenu(IdAndIdsParam param);

    /**
     * 删除角色菜单关系
     *
     * @param param
     * @return
     */
    int deleteRoleMenu(IdAndIdsParam param);

    /**
     * 判断用户是否有权限
     *
     * @param userId 用户id
     * @param access 权限标识
     * @return
     */
    boolean hasAccess(Long userId, String access);

    /**
     * 加载用户权限资源标识
     *
     * @param userId
     * @return
     */
    List<String> loadUserAccessList(Long userId);

    /**
     * 加载用户菜单权限
     *
     * @param userId
     * @return
     */
    List<SysMenu> loadUserMenuList(Long userId);

    /**
     * 获取路由菜单
     *
     * @param userId
     * @return
     */
    List<RouterVo> getRouters(Long userId);
}
